package thinkinjava4.ch15_generics;

interface FactoryI<T> {
    T create();
}

/**
 * 工厂方式创建泛型对象
 *
 * @param <T>
 */
class Foo2<T> {
    private T x;

    public <F extends FactoryI<T>> Foo2(F factory) {
        x = factory.create();
    }

    public void f() {
        System.out.println(x.getClass().getName());
    }
}

class IntegerFactory implements FactoryI<Integer> {

    @Override
    public Integer create() {
        return 0;
    }
}

class Widget {
    public static class Factory implements FactoryI<Widget> {
        @Override
        public Widget create() {
            return new Widget();
        }
    }
}

public class FactoryConstraint {
    public static void main(String[] args) {
        Foo2 f1 = new Foo2<>(new IntegerFactory());
        Foo2 f2 = new Foo2<>(new Widget.Factory());
        f1.f();
        f2.f();
    }
}
